import type { App, Directive, DirectiveBinding } from "vue";

import { hookI18n } from "@/hooks/hookI18n";
const { t } = hookI18n();

const all_permission = ["*.*.*"];

function getPermission(value: string | string[]): boolean {
    let x = value;
    let s = t("zdemo.localDemo");
    // const permissions = wsCache.get(.getUserInfo).permissions as string[]
    // if (!value) {
    //     throw new Error(t('permission.hasPermission'))
    // }
    // if (!isArray(value)) {
    //     return permissions?.includes(value as string)
    // }
    // if (all_permission[0] === permissions[0]) {
    //     return true
    // }
    // return (intersection(value, permissions) as string[]).length > 0
    return true;
}

function hasPermission(el: Element, binding: DirectiveBinding) {
    const value = binding.value;
    const flag = getPermission(value);
    if (!flag) {
        el.parentNode?.removeChild(el);
    }
}

function mounted(el: Element, binding: DirectiveBinding) {
    hasPermission(el, binding);
}

// 自定义指令
export const hasPermi: Directive = {
    mounted,
};

// 自定义指令
const myDirective = {
    /**
     * 在绑定元素的 attribute 前或事件监听器应用前调用
     * @param el 指令绑定到的元素。这可以用于直接操作 DOM
     * @param binding 绑定对象
     * @param vnode 代表绑定元素的底层 VNode
     * @param prevVnode 之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。
     */
    created(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},
    /**
     * 在元素被插入到 DOM 前调用
     */
    beforeMount(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},
    /**
     * 在绑定元素的父组件及他自己的所有子节点都挂载完成后调用
     * @param el
     * @param binding
     * @param vnode
     * @param prevVnode
     */
    mounted(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},
    /**
     * 绑定元素的父组件更新前调用
     * @param el
     * @param binding
     * @param vnode
     * @param prevVnode
     */
    beforeUpdate(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},
    /**
     * 在绑定元素的父组件及他自己的所有子节点都更新后调用
     * @param el
     * @param binding
     * @param vnode
     * @param prevVnode
     */
    updated(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},
    /**
     * 绑定元素的父组件卸载前调用
     * @param el
     * @param binding
     * @param vnode
     * @param prevVnode
     */
    beforeUnmount(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},
    /**
     * 绑定元素的父组件卸载后调用
     * @param el
     * @param binding
     * @param vnode
     * @param prevVnode
     */
    unmounted(el: Element, binding: DirectiveBinding, vnode: VNode, prevVnode: VNode) {},

    // binding  绑定对象包含以下属性:
    // value：传递给指令的值.例如在 v-my-directive="1 + 1" 中，值是 2。
    // oldValue：之前的值，仅在 beforeUpdate 和 updated 中可用。无论值是否更改，它都可用。
    // arg：传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中，参数是 "foo"。
    // modifiers：一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中，修饰符对象是 { foo: true, bar: true }。
    // instance：使用该指令的组件实例。
    // dir：指令的定义对象。
};
